Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3장. HLS 구조와 Playlist(m3u8) 완전 해부

3.1 HLS 구조의 전체 그림

2장에서 HLS는 영상을 “조각 단위로 나눈다”고 설명했다.
하지만 단순히 파일을 나누는 것만으로는 스트리밍이 동작할 수 없다.

플레이어는 다음을 알아야 한다.

  • 어떤 화질이 존재하는가
  • 어떤 순서로 재생해야 하는가
  • 다음에 무엇을 가져와야 하는가

이 문제를 해결하기 위해 HLS는 다음 구조를 가진다.

Playlist + Segment + Player

이 중에서 핵심은:

Playlist (m3u8)

왜냐하면:

플레이어는 실제 영상이 아니라 “playlist를 기준으로” 동작하기 때문이다


3.2 실제 HLS 디렉토리 구조

이론보다 실제 구조를 보는 것이 이해가 빠르다.

📁 예시 구조

hls/
├── master.m3u8
├── 1080p/
│   ├── index.m3u8
│   ├── seg100.ts
│   ├── seg101.ts
│   └── ...
├── 720p/
│   ├── index.m3u8
│   ├── seg100.ts
│   ├── seg101.ts
│   └── ...
└── 480p/
    ├── index.m3u8
    ├── seg100.ts
    ├── seg101.ts
    └── ...

✔ 구조 특징

  • 화질별로 완전히 분리된 디렉토리
  • 동일한 시간 구간이 여러 화질로 존재

예:

1080p/seg100.ts
720p/seg100.ts
480p/seg100.ts

👉 모두 동일한 시간 구간

이 구조 덕분에:

플레이어는 같은 시점에서 화질을 자유롭게 변경할 수 있다 (ABR)


3.3 Master Playlist (전체 스트림 정의)

📄 master.m3u8

#EXTM3U

#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720
720p/index.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360
480p/index.m3u8

✔ 역할

사용 가능한 화질 목록 제공

✔ 주요 정보

  • BANDWIDTH → 요구 네트워크 속도
  • RESOLUTION → 해상도

✔ 플레이어 동작

  • 네트워크 상태 측정
  • 적절한 화질 선택

👉 즉:

ABR은 master playlist에서 시작된다


3.4 Media Playlist (실제 재생의 핵심)

📄 index.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:100

#EXTINF:2.0,
seg100.ts

#EXTINF:2.0,
seg101.ts

#EXTINF:2.0,
seg102.ts

이 파일은 실제 재생 순서를 정의한다.


3.5 Media Playlist 주요 태그

1) #EXT-X-TARGETDURATION

#EXT-X-TARGETDURATION:2

👉 의미:

segment 최대 길이 (초)

👉 중요성:

  • 짧을수록 지연 감소
  • 길수록 요청 횟수 감소

👉 핵심:

Latency vs 효율의 트레이드오프


2) #EXT-X-MEDIA-SEQUENCE

#EXT-X-MEDIA-SEQUENCE:100

👉 의미:

현재 playlist의 시작 segment 번호

👉 중요성:

  • 라이브 스트리밍 기준 위치
  • 현재 재생 시점 판단 기준

3) #EXTINF

#EXTINF:2.0,
seg100.ts

👉 의미:

  • segment 길이
  • 파일 위치

👉 즉:

“이 조각은 몇 초짜리고, 어디에 있다”


3.6 Segment 파일 형식 (TS vs m4s)

앞에서는 .ts 기준으로 설명했지만,
실제 HLS에서는 두 가지 포맷이 사용된다.

✔ MPEG-TS (.ts)

  • 전통적인 HLS 포맷
  • 방송용 포맷 기반
  • 안정성 높음

👉 특징:

  • 구조 단순
  • 오류 복구 쉬움
  • 호환성 매우 높음

✔ fMP4 (.m4s)

  • 최신 HLS에서 사용
  • MP4 기반 fragment 구조

👉 특징:

  • 압축 효율 좋음
  • 파일 크기 작음
  • 저지연 스트리밍에 유리

✔ 왜 둘 다 존재하는가

  • TS → 안정성과 호환성
  • m4s → 효율성과 확장성

👉 핵심 정리:

HLS의 핵심은 포맷이 아니라 “playlist 기반 구조”다


3.7 플레이어 동작 흐름

플레이어는 다음 과정을 반복한다.

전체 흐름

1. master.m3u8 요청
2. 화질 선택
3. index.m3u8 요청
4. segment 다운로드
5. 재생
6. index.m3u8 재요청

👉 핵심 특징:

플레이어는 playlist를 계속 다시 읽는다


3.8 Live Streaming 구조 (Sliding Window)

라이브에서는 playlist가 계속 변경된다.

초기 상태

#EXT-X-MEDIA-SEQUENCE:100
seg100
seg101
seg102

이후

#EXT-X-MEDIA-SEQUENCE:101
seg101
seg102
seg103

✔ 특징

  • 오래된 segment 제거
  • 새로운 segment 추가

👉 이 구조를:

Sliding Window

라고 한다.

👉 의미:

항상 최신 영상만 유지한다


3.9 HLS 구조의 본질

이제 전체를 정리하면 다음과 같다.

✔ 서버 역할

  • playlist 제공
  • segment 제공

✔ 플레이어 역할

  • playlist 분석
  • 다음 segment 계산
  • 직접 요청

👉 핵심:

HLS는 서버가 보내는 구조가 아니라
클라이언트가 가져오는 구조다


3.10 구조가 만드는 영향

✔ 장점

  • ABR 가능
  • CDN 캐싱 가능
  • 네트워크 안정성

❗ 단점

  • polling 구조 → 지연 발생
  • segment 단위 → 즉시성 부족